package com.hd123.rumba.gwt.widget2e.client.form;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.hd123.rumba.gwt.widget2.client.form.RTextBox;
import com.hd123.rumba.gwt.widget2.client.misc.RImageLocation;
import com.hd123.rumba.gwt.widget2.client.toolbar.RToolbarButton;
import com.hd123.rumba.gwt.widget2e.client.dialog.RBrowserDialog;

/**
 * 组合控件：文本框+浏览按钮
 * <p>
 * 和RUCNBox的不同之处在于RBrowseBox只有一个文本框，而RUCNBox有一个代码框和一个名称框，
 * 相同之处是两者都有一个浏览按钮。
 * <p>
 * RBrowseBox的应用场景：
 * <li>单据界面，单号输入框，用户输入一个单号并回车，系统查找对应的单据加载到界面上，用户也可以点击单号输入框旁的
 * 浏览按钮，在单据浏览对话框中选择一个加载到界面。</li>
 * <li>
 * 表单中，某个字段，只允许从浏览对话框选择，不允许直接输入。此时就需要用到RBrowseBox，且需要把文本框置为只读。</li>
 * 
 * @author LiQi
 * 
 */
public class RBrowseBox extends RTextBox {

  private static final String IMAGE_BROWSEBUTTON = "images/form/browser_small.gif";
  private static final String IMAGE_BROWSEBUTTON_DISABLED = "images/form/browser_small_dis.gif";

  /** 浏览对话框 */
  private RBrowserDialog browser;

  /** 浏览按钮 */
  private RToolbarButton browseButton;

  public RBrowseBox() {
    super();

    browseButton = new RToolbarButton();
    browseButton.setIcon(new RImageLocation(IMAGE_BROWSEBUTTON));
    browseButton.setDisabledIcon(new RImageLocation(IMAGE_BROWSEBUTTON_DISABLED));
    browseButton.addClickHandler(new BrowseButtonHandler());
    addButton(browseButton);
  }

  /**
   * 浏览对话框
   * 
   * @return
   */
  public RBrowserDialog getBrowser() {
    return browser;
  }

  /**
   * 设置浏览对话框
   * 
   * @param browser
   */
  public void setBrowser(RBrowserDialog browser) {
    this.browser = browser;
  }

  public void setReadOnly(boolean readOnly) {
    super.setReadOnly(readOnly);
    refreshBrowseButton();
  }

  public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    refreshBrowseButton();
  }

  /**
   * 根据只读和禁用状态设置浏览按钮的状态
   * 
   */
  private void refreshBrowseButton() {
    browseButton.setEnabled(!isReadOnly() && isEnabled());
  }

  /**
   * 浏览按钮事件处理
   * 
   * @author LiQi
   * 
   */
  private class BrowseButtonHandler implements ClickHandler {
    public void onClick(ClickEvent event) {
      if (browser != null)
        browser.center();
    }
  }
}
